package com.knowledge.review.designPatterns.creatormode.prototypepattern.copy;

import lombok.Data;

@Data
//public class Clazz implements Cloneable {
public class Clazz {
    private String name;
    private Student student;

    // Clazz类
    private static Clazz clazz = new Clazz();

    private Clazz() {
    }

    public static Clazz getInstance() {
        return clazz;
    }
//    @Override
//    protected Object clone() throws CloneNotSupportedException {
//        return super.clone();
//    }

    @Override
    protected Object clone() {
        return clazz;
    }
}


class Test {

    public static void main(String[] args) throws Exception {
        Clazz clazz1 = Clazz.getInstance();
        Clazz clazz2 = (Clazz) clazz1.clone();
        System.out.println(clazz1 == clazz2); // false
    }


    // 创建一个新对象，新对象的属性和原来对象完全相同，
    // 对于非基本类型属性，仍指向原有属性所指向的对象的内存地址。
//    public static void main(String[] args) throws Exception {
//        Clazz clazz1 = new Clazz();
//        clazz1.setName("高三一班");
//        Student stu1 = new Student("张三", "男", 18);
//        clazz1.setStudent(stu1);
//        System.out.println(clazz1); // Clazz(name=高三一班, student=Student(name=张三, sex=男, age=18))
//        Clazz clazz2 = (Clazz) clazz1.clone();
//        Student stu2 = clazz2.getStudent();
//        stu2.setName("李四");
//        /*
//         * 可以看到，当修改了stu2的姓名时，stu1的姓名同样也被修改了，
//         * 这说明stu1和stu2是同一个对象，这就是浅克隆的特点，
//         * 对具体原型类中的引用类型的属性进行引用的复制。同时，这也可能是浅克隆所带来的弊端，
//         * 因为结合该例子的原意，显然是想在班级中新增一名叫李四的学生，
//         * 而非让所有的学生都改名叫李四，于是我们这里就要使用深克隆。
//         * */
//        System.out.println(clazz1); // Clazz(name=高三一班, student=Student(name=李四, sex=男, age=18))
//        System.out.println(clazz2); // Clazz(name=高三一班, student=Student(name=李四, sex=男, age=18))
//    }
}
 
